/**
 * 
 */
package br.com.felipe.agendamento.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.xml.bind.annotation.XmlRootElement;

import org.codehaus.jackson.annotate.JsonManagedReference;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import br.com.felipe.agendamento.utils.serializer.JsonDateSerializer;

import com.sun.xml.internal.bind.CycleRecoverable;



/**
 * @author Felipe Tavares
 *
 */
@Entity
@Table(name="pessoa")
@XmlRootElement
public class PessoaDto implements Serializable, CycleRecoverable{

	@Transient
	private static final long serialVersionUID = 5442518277922490629L;

	@Id @GeneratedValue(strategy=GenerationType.AUTO)
	@Column(name="id_pessoa")
	private Integer idPessoa;
	
	@OneToOne(cascade=CascadeType.ALL)
	@JoinColumn(name="fk_endereco")
	private EnderecoDto enderecoDto;

	@OneToMany(targetEntity = TelefoneDto.class, fetch = FetchType.LAZY, mappedBy="pessoaDto", cascade = CascadeType.ALL)
	@JsonManagedReference("tel-pessoa")
	private List<TelefoneDto> listaTelefones;
	
	@OneToMany(targetEntity = EmailDto.class, fetch = FetchType.LAZY, mappedBy="pessoaDto", cascade = CascadeType.ALL)
	@JsonManagedReference("email-pessoa")
	private List<EmailDto> listaEmail;
	
	@Column
	private String nome;
	
	@Column
	@Temporal(TemporalType.DATE)
	private Date nascimento;
	
	@Column
	private String sexo;
	
	@Column
	private String cpf;
	
	public Integer getIdPessoa() {
		return idPessoa;
	}
	public void setIdPessoa(Integer idPessoa) {
		this.idPessoa = idPessoa;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getSexo() {
		return sexo;
	}
	public void setSexo(String sexo) {
		this.sexo = sexo;
	}
	public String getCpf() {
		return cpf;
	}
	public void setCpf(String cpf) {
		this.cpf = cpf;
	}
	@JsonSerialize(using = JsonDateSerializer.class)
	public Date getNascimento() {
		return nascimento;
	}
	public void setNascimento(Date nascimento) {
		this.nascimento = nascimento;
	}
	public List<TelefoneDto> getListaTelefones() {
		return listaTelefones;
	}
	public void setListaTelefones(List<TelefoneDto> listaTelefones) {
		this.listaTelefones = listaTelefones;
	}
	public List<EmailDto> getListaEmail() {
		return listaEmail;
	}
	public void setListaEmail(List<EmailDto> listaEmail) {
		this.listaEmail = listaEmail;
	}
	public EnderecoDto getEnderecoDto() {
		return enderecoDto;
	}
	public void setEnderecoDto(EnderecoDto enderecoDto) {
		this.enderecoDto = enderecoDto;
	}
	@Override
	public Object onCycleDetected(CycleRecoverable.Context context) {
		PessoaDto dto = new PessoaDto();
		dto.setIdPessoa(this.getIdPessoa());
		return dto;
	}
}
